package com.zshy.base.core.contract.enums;

import com.zshy.base.core.contract.exception.ServiceException;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;

/**
 * 国家代码枚举类
 *
 * @author zhouhengzhe
 */
@Getter
@AllArgsConstructor
public enum AreaCodeEnum {
    CN("CHINA", "中国", "CN", "86"),
    AF("Afghanistan", "阿富汗", "AF", "93"),
    AL("Albania", "阿尔巴尼亚", "AL", "355"),
    DZ("Algeria", "阿尔及利亚", "DZ", "213"),
    AS("American Samoa", "美属萨摩亚", "AS", "1684"),
    AD("Andorra", "安道尔", "AD", "376"),
    AO("Angola", "安哥拉", "AO", "244"),
    AI("Anguilla", "安圭拉", "AI", "1264"),
    AG("Antigua and Barbuda", "安提瓜和巴布达", "AG", "1268"),
    AR("Argentina", "阿根廷", "AR", "54"),
    AM("Armenia", "亚美尼亚", "AM", "374"),
    AW("Aruba", "阿鲁巴", "AW", "297"),
    AU("Australia", "澳大利亚", "AU", "61"),
    AT("Austria", "奥地利", "AT", "43"),
    AZ("Azerbaijan", "阿塞拜疆", "AZ", "994"),
    BS("Bahamas", "巴哈马", "BS", "1242"),
    BH("Bahrain", "巴林", "BH", "973"),
    BD("Bangladesh", "孟加拉国", "BD", "880"),
    BB("Barbados", "巴巴多斯", "BB", "1246"),
    BY("Belarus", "白俄罗斯", "BY", "375"),
    BE("Belgium", "比利时", "BE", "32"),
    BZ("Belize", "伯利兹", "BZ", "501"),
    BJ("Benin", "贝宁", "BJ", "229"),
    BM("Bermuda", "百慕大群岛", "BM", "1441"),
    BT("Bhutan", "不丹", "BT", "975"),
    BO("Bolivia", "玻利维亚", "BO", "591"),
    BA("Bosnia and Herzegovina", "波斯尼亚和黑塞哥维那", "BA", "387"),
    BW("Botswana", "博茨瓦纳", "BW", "267"),
    BR("Brazil", "巴西", "BR", "55"),
    BN("Brunei", "文莱", "BN", "673"),
    BG("Bulgaria", "保加利亚", "BG", "359"),
    BF("Burkina Faso", "布基纳法索", "BF", "226"),
    BI("Burundi", "布隆迪", "BI", "257"),
    KH("Cambodia", "柬埔寨", "KH", "855"),
    CM("Cameroon", "喀麦隆", "CM", "237"),
    COD("Congo, Dem. Rep.", "扎伊尔", "COD", "243"),
    KY("Cayman Islands", "开曼群岛", "KY", "1345"),
    CF("Central African Republic", "中非共和国", "CF", "236"),
    CIV("Ivory Coast", "科特迪瓦", "CIV", "225"),
    TD("Chad", "乍得", "TD", "235"),
    CL("Chile", "智利", "CL", "56"),
    CO("Colombia", "哥伦比亚", "CO", "57"),
    CPV("Cape Verde", "佛得角", "CPV", "238"),
    KM("Comoros", "科摩罗", "KM", "269"),
    CK("Cook Islands", "库克群岛", "CK", "682"),
    CR("Costa Rica", "哥斯达黎加", "CR", "506"),
    CU("Cuba", "古巴", "CU", "53"),
    HR("Croatia", "克罗地亚", "HR", "285"),
    CW("Curacao", "库拉索", "CW", "599"),
    CY("Cyprus", "塞浦路斯", "CY", "357"),
    CZ("Czech", "捷克", "CZ", "420"),
    DK("Denmark", "丹麦", "DK", "45"),
    DJ("Djibouti", "吉布提", "DJ", "253"),
    DM("Dominica", "多米尼克", "DM", "1767"),
    DO("Dominican Republic", "多米尼加共和国", "DO", "1809"),
    EC("Ecuador", "厄瓜多尔", "EC", "593"),
    EG("Egypt", "埃及", "EG", "20"),
    SV("El Salvador", "萨尔瓦多", "SV", "503"),
    GQ("Equatorial Guinea", "赤道几内亚", "GQ", "240"),
    ER("Eritrea", "厄立特里亚", "ER", "291"),
    EE("Estonia", "爱沙尼亚", "EE", "372"),
    ET("Ethiopia", "埃塞俄比亚", "ET", "251"),
    FO("Faroe Islands", "法罗群岛", "FO", "298"),
    FJ("Fiji", "斐济", "FJ", "679"),
    FI("Finland", "芬兰", "FI", "358"),
    FR("France", "法国", "FR", "33"),
    GF("French Guiana", "法属圭亚那", "GF", "594"),
    PF("French Polynesia", "法属波利尼西亚", "PF", "689"),
    GA("Gabon", "加蓬", "GA", "241"),
    GM("Gambia", "冈比亚", "GM", "220"),
    GE("Georgia", "格鲁吉亚", "GE", "995"),
    DE("Germany", "德国", "DE", "49"),
    GH("Ghana", "加纳", "GH", "233"),
    GI("Gibraltar", "直布罗陀", "GI", "350"),
    GR("Greece", "希腊", "GR", "30"),
    GL("Greenland", "格陵兰岛", "GL", "299"),
    GD("Grenada", "格林纳达", "GD", "1473"),
    GP("Guadeloupe", "瓜德罗普岛", "GP", "590"),
    GU("Guam", "关岛", "GU", "1671"),
    GT("Guatemala", "危地马拉", "GT", "502"),
    GN("Guinea", "几内亚", "GN", "224"),
    GW("Guinea-Bissau", "几内亚比绍共和国", "GW", "245"),
    GY("Guyana", "圭亚那", "GY", "592"),
    HT("Haiti", "海地", "HT", "509"),
    HN("Honduras", "洪都拉斯", "HN", "504"),
    HK("Hong Kong (China)", "中国香港", "HK", "852"),
    HU("Hungary", "匈牙利", "HU", "36"),
    IS("Iceland", "冰岛", "IS", "354"),
    IN("India", "印度", "IN", "91"),
    ID("Indonesia", "印度尼西亚", "ID", "62"),
    IQ("Iraq", "伊拉克", "IQ", "964"),
    IE("Ireland", "爱尔兰", "IE", "353"),
    IR("Iran", "伊朗", "IR", "98"),
    IL("Israel", "以色列", "IL", "972"),
    IT("Italy", "意大利", "IT", "39"),
    CI("Ivory Coast", "象牙海岸", "CI", "225"),
    JM("Jamaica", "牙买加", "JM", "1876"),
    JP("Japan", "日本", "JP", "81"),
    JO("Jordan", "约旦", "JO", "962"),
    KZ("Kazakhstan", "哈萨克斯坦", "KZ", "7"),
    KE("Kenya", "肯尼亚", "KE", "254"),
    KI("Kiribati", "基里巴斯", "KI", "686"),
    KW("Kuwait", "科威特", "KW", "985"),
    KG("Kyrgyzstan", "吉尔吉斯斯坦", "KG", "996"),
    LA("Laos", "老挝", "LA", "856"),
    LV("Latvia", "拉脱维亚", "LV", "371"),
    LB("Lebanon", "黎巴嫩", "LB", "961"),
    LS("Lesotho", "莱索托", "LS", "266"),
    LR("Liberia", "利比里亚", "LR", "231"),
    LY("Libya", "利比亚", "LY", "218"),
    LI("Liechtenstein", "列支敦士登", "LI", "423"),
    LT("Lithuania", "立陶宛", "LT", "370"),
    LU("Luxembourg", "卢森堡", "LU", "352"),
    MO("Macau (China)", "中国澳门", "MO", "853"),
    MK("Macedonia", "马其顿", "MK", "389"),
    MG("Madagascar", "马达加斯加", "MG", "261"),
    MW("Malawi", "马拉维", "MW", "265"),
    MY("Malaysia", "马来西亚", "MY", "60"),
    MV("Maldives", "马尔代夫", "MV", "960"),
    ML("Mali", "马里", "ML", "223"),
    MT("Malta", "马耳他", "MT", "356"),
    MQ("Martinique", "马提尼克", "MQ", "596"),
    MI("Mariana lslands", "马里亚纳群岛", "MI", "1670"),
    MR("Mauritania", "毛里塔尼亚", "MR", "222"),
    MU("Mauritius", "毛里求斯", "MU", "230"),
    YT("Mayotte", "马约特", "YT", "269"),
    MX("Mexico", "墨西哥", "MX", "52"),
    MD("Moldova", "摩尔多瓦", "MD", "373"),
    MC("Monaco", "摩纳哥", "MC", "377"),
    MN("Mongolia", "蒙古", "MN", "976"),
    ME("Montenegro", "黑山", "ME", "382"),
    MS("Montserrat", "蒙特塞拉特岛", "MS", "1664"),
    MA("Morocco", "摩洛哥", "MA", "212"),
    MZ("Mozambique", "莫桑比克", "MZ", "258"),
    MM("Myanmar", "缅甸", "MM", "95"),
    NA("Namibia", "纳米比亚", "NA", "264"),
    NP("Nepal", "尼泊尔", "NP", "977"),
    NL("Netherlands", "荷兰", "NL", "31"),
    AN("Netherlands Antilles", "荷属安德列斯群岛", "AN", "599"),
    NC("New Caledonia", "新喀里多尼亚", "NC", "687"),
    NZ("New Zealand", "新西兰", "NZ", "64"),
    NI("Nicaragua", "尼加拉瓜", "NI", "505"),
    NE("Niger", "尼日尔", "NE", "227"),
    NG("Nigeria", "尼日利亚", "NG", "234"),
    NO("Norway", "挪威", "NO", "47"),
    NFK("Norfolk Island", "诺福克岛", "NFK", "6723"),
    OM("Oman", "阿曼", "OM", "968"),
    PK("Pakistan", "巴基斯坦", "PK", "92"),
    PW("Palau", "帕劳", "PW", "680"),
    BL("Palestine", "巴勒斯坦", "BL", "970"),
    PA("Panama", "巴拿马", "PA", "507"),
    PG("Papua New Guinea", "巴布亚新几内亚", "PG", "675"),
    PY("Paraguay", "巴拉圭", "PY", "595"),
    PE("Peru", "秘鲁", "PE", "51"),
    PH("Philippines", "菲律宾", "PH", "63"),
    PL("Poland", "波兰", "PL", "48"),
    PT("Portugal", "葡萄牙", "PT", "351"),
    PR("Puerto Rico", "波多黎各", "PR", "1787"),
    KP("Korea N. Dem.Peoples Rep.", "朝鲜", "KP", "850"),
    QA("Qatar", "卡塔尔", "QA", "974"),
    CG("Republic Of The Congo", "刚果共和国", "CG", "242"),
    RE("Réunion Island", "留尼汪", "RE", "262"),
    RO("Romania", "罗马尼亚", "RO", "40"),
    RU("Russia", "俄罗斯", "RU", "7"),
    RW("Rwanda", "卢旺达", "RW", "250"),
    KN("Saint Kitts and Nevis", "圣基茨和尼维斯", "KN", "1869"),
    LC("Saint Lucia", "圣卢西亚", "LC", "1758"),
    PM("Saint Pierre and Miquelon", "圣彼埃尔和密克隆岛", "PM", "508"),
    VC("Saint Vincent and The Grenadines", "圣文森特和格林纳丁斯", "VC", "1784"),
    WS("Samoa", "萨摩亚", "WS", "685"),
    SM("San Marino", "圣马力诺", "SM", "378"),
    ST("Sao Tome and Principe", "圣多美和普林西比", "ST", "239"),
    SA("Saudi Arabia", "沙特阿拉伯", "SA", "966"),
    SN("Senegal", "塞内加尔", "SN", "221"),
    RS("Serbia", "塞尔维亚", "RS", "381"),
    SC("Seychelles", "塞舌尔", "SC", "248"),
    SY("Syrian Arab Republic", "叙利亚", "SY", "963"),
    SL("Sierra Leone", "塞拉利昂", "SL", "232"),
    SG("Singapore", "新加坡", "SG", "65"),
    SX("Saint Maarten (Dutch Part)", "圣马丁岛（荷兰部分）", "SX", "1721"),
    SK("Slovakia", "斯洛伐克", "SK", "421"),
    SI("Slovenia", "斯洛文尼亚", "SI", "386"),
    SB("Solomon Islands", "所罗门群岛", "SB", "677"),
    SO("Somalia", "索马里", "SO", "252"),
    ZA("South Africa", "南非", "ZA", "27"),
    KR("South Korea", "韩国", "KR", "82"),
    ES("Spain", "西班牙", "ES", "34"),
    LK("Sri Lanka", "斯里兰卡", "LK", "94"),
    SR("Suriname", "苏里南", "SR", "597"),
    SZ("Swaziland", "斯威士兰", "SZ", "268"),
    SE("Sweden", "瑞典", "SE", "46"),
    CH("Switzerland", "瑞士", "CH", "41"),
    TW("Taiwan (China)", "中国台湾", "TW", "886"),
    TJ("Tajikistan", "塔吉克斯坦", "TJ", "992"),
    TZ("Tanzania", "坦桑尼亚", "TZ", "255"),
    TH("Thailand", "泰国", "TH", "66"),
    TL("Timor-Leste", "东帝汶", "TL", "670"),
    SDN("The Republic of the Sudan", "苏丹", "SDN", "249"),
    SSD("The Republic of South Sudan", "南苏丹", "SSD", "211"),
    FSM("The Federated States of Micronesia", "密克罗尼西亚", "FSM", "691"),
    TG("Togo", "多哥", "TG", "228"),
    TO("Tonga", "汤加", "TO", "676"),
    TT("Trinidad and Tobago", "特立尼达和多巴哥", "TT", "1868"),
    TN("Tunisia", "突尼斯", "TN", "216"),
    TR("Turkey", "土耳其", "TR", "90"),
    TM("Turkmenistan", "土库曼斯坦", "TM", "993"),
    TC("Turks and Caicos Islands", "特克斯和凯科斯群岛", "TC", "1649"),
    UG("Uganda", "乌干达", "UG", "256"),
    UA("Ukraine", "乌克兰", "UA", "380"),
    UAE("United Arab Emirates", "阿拉伯联合酋长国", "UAE", "971"),
    GB("United Kingdom", "英国", "GB", "44"),
    US("United States", "美国", "US", "1"),
    UY("Uruguay", "乌拉圭", "UY", "598"),
    UZ("Uzbekistan", "乌兹别克斯坦", "UZ", "998"),
    VU("Vanuatu", "瓦努阿图", "VU", "678"),
    VE("Venezuela", "委内瑞拉", "VE", "58"),
    VN("Vietnam", "越南", "VN", "84"),
    VG("Virgin Islands, British", "英属维尔京群岛", "VG", "1340"),
    VI("Virgin Islands, US", "美属维尔京群岛", "VI", "1284"),
    YE("Yemen", "也门", "YE", "967"),
    ZM("Zambia", "赞比亚", "ZM", "260"),
    ZW("Zimbabwe", "津巴布韦", "ZW", "263");


    /**
     * 国家或者地区
     */
    private final String country;

    /**
     * 中文名
     */
    private final String chineseName;

    /**
     * 代号
     */
    private final String code;


    /**
     * 国家（或地区）码
     */
    private final String countryCode;


    /**
     * 通过国家码获取国家代码枚举
     */
    public static String getCodeEnumByCountryCode(String countryCode) {
        if (StringUtils.isBlank(countryCode)) {
            throw new ServiceException("国际区号不能为空");
        }
        for (AreaCodeEnum areaCodeEnum : AreaCodeEnum.values()) {
            if (areaCodeEnum.getCountryCode().equalsIgnoreCase(countryCode)) {
                return areaCodeEnum.getCode();
            }
        }
        throw new ServiceException("国际区号没有匹配的数据");
    }
}
